import axios, { AxiosError, type Method } from 'axios'
import { useUserStore } from '@/stores'
import { showFailToast } from 'vant'
import router from '@/router'

const instance = axios.create({
  //  1. 基础地址，超时时间
  baseURL: 'https://consult-api.itheima.net/',
  timeout: 10000
})

instance.interceptors.request.use(
  (config) => {
    const store = useUserStore()
    //  2. 携带token
    if (store.user?.token && config.headers) {
      config.headers.Authorization = `Bearer ${store.user.token}`
    }
    return config
  },
  (err) => Promise.reject(err)
)

instance.interceptors.response.use(
  // TODO 3. 网络成功的处理
  (res) => {
    // TODO 3.1 处理业务失败
    // 业务失败处理思路：
    // 1. 如何判断业务失败？ code 不是 10000 (接口文档）
    // 2. 失败后需要做什么？ 弹出轻提示，此时返回一个失败的promise，传递code给catch
    if (res.data.code !== 10000) {
      // 错误提示
      showFailToast(res.data.message || '业务失败')
      // 返回 错误的promise
      return Promise.reject(res.data)
      // 传入 code 将来catch的时候可以使用
    }
    // TODO 3.2 业务成功 摘取核心响应数据
    return res.data
  },
  // TODO 4. 处理401等异常错误
  (err: AxiosError) => {
    if (err.response?.status === 401) {
      showFailToast('登录失效，请重新登录')
      const store = useUserStore()
      store.delUser()
      router.push({
        path: '/',
        query: { returnUrl: router.currentRoute.value.fullPath }
      })
    }
    return Promise.reject(err)
  }
)
export default instance

type data<T> = {
  code: number
  message: string
  data: T
}
// 请求函数封装
export const request = <T>(
  url: string,
  method: Method = 'GET',
  submitData?: object
) => {
  // 参数：地址，请求方式，提交的数据
  // 返回: promise
  return instance.request<any, data<T>>({
    url,
    method,
    [method.toUpperCase() === 'GET' ? 'params' : 'data']: submitData
  })
}
